package com.ruoyi.attendance.utils;

import com.ruoyi.common.utils.StringUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;

/**
 * 日期处理工具类（适配考勤系统时间判断需求）
 */
public class DateUtils {
    /**
     * 标准日期时间格式
     */
    public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    /**
     * 标准日期格式
     */
    public static final String DATE_FORMAT = "yyyy-MM-dd";

    /**
     * 获取当日开始时间（00:00:00）
     */
    public static LocalDateTime getStartOfDay(LocalDateTime dateTime) {
        return LocalDateTime.of(dateTime.toLocalDate(), LocalTime.MIN);
    }

    /**
     * 获取当日结束时间（23:59:59）
     */
    public static LocalDateTime getEndOfDay(LocalDateTime dateTime) {
        return LocalDateTime.of(dateTime.toLocalDate(), LocalTime.MAX);
    }

    /**
     * 获取当月开始时间（当月1日 00:00:00）
     */
    public static LocalDateTime getStartOfMonth(LocalDateTime dateTime) {
        return LocalDateTime.of(dateTime.getYear(), dateTime.getMonth(), 1, 0, 0, 0);
    }

    /**
     * 获取当月结束时间（当月最后1日 23:59:59）
     */
    public static LocalDateTime getEndOfMonth(LocalDateTime dateTime) {
        LocalDate lastDayOfMonth = dateTime.toLocalDate().with(TemporalAdjusters.lastDayOfMonth());
        return LocalDateTime.of(lastDayOfMonth, LocalTime.MAX);
    }

    /**
     * 获取当月总天数
     */
    public static int getDaysInMonth(LocalDateTime dateTime) {
        return dateTime.toLocalDate().lengthOfMonth();
    }

    /**
     * 字符串转LocalDateTime
     */
    public static LocalDateTime parseLocalDateTime(String dateStr) {
        if (StringUtils.isEmpty(dateStr)) {
            return null;
        }
        return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(DATETIME_FORMAT));
    }

    /**
     * LocalDateTime转字符串
     */
    public static String format(LocalDateTime dateTime, String pattern) {
        if (dateTime == null || StringUtils.isEmpty(pattern)) {
            return null;
        }
        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
    }
}